home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / GAMESDS3.DMS / GAMESDS3.adf / GDS_Examples.lha / Examples / misc / vector.c < prev    next >
C/C++ Source or Header  |  1994-11-14  |  11KB  |  334 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <exec/types.h>
  5. #include <graphics/gfx.h>
  6. #include <graphics/gfxbase.h>
  7.  
  8. #include <proto/exec.h>
  9. #include <proto/graphics.h>
  10.  
  11. #include "GameSmith:GameSmith.h"
  12. #include "GameSmith:include/libraries/libptrs.h"
  13.  
  14. /*-------------------------------------------------------------------------*/
  15.  
  16. #define VIDEO_STEPS      30
  17. #define COLOR_GRADIENT   0x100            /* color change amount */
  18. #define VIDEO_REG         0x180            /* address of bg color reg */
  19. #define BGCOLOR         0xf00            /* max color value (bright red) */
  20. #define BGCOLOR_LONG      0x00ff0000      /* 8 bit color entry (bright red) */
  21. #define MIN_COLOR         0x000
  22.  
  23. #define THRESHOLD         1000            /* number of lines before clear screen */
  24.  
  25. /*-------------------------------------------------------------------------*/
  26. /* Function Prototypes                                                      */
  27.  
  28. void parser(int,char **);
  29. int setup(void);
  30. void build_copper(void);
  31. void draw_vector(void);
  32. void clear_bitmap(struct BitMap *);
  33. int check_close(void);
  34. void cleanup(void);
  35.  
  36. /*-------------------------------------------------------------------------*/
  37. /* some global variables                                                   */
  38.  
  39. int swidth,sheight,smode,copheight;
  40.  
  41. /*-------------------------------------------------------------------------*/
  42.  
  43. unsigned short copper_list[256];   /* enough for our custom copper list */
  44.  
  45. unsigned long ctbl[2] = {BGCOLOR_LONG,0x00ffff00};
  46.  
  47. struct gs_viewport vp =
  48.    {
  49.    NULL,                           /* ptr to next viewport */
  50.    ctbl,                           /* ptr to color table */
  51.    2,                              /* number of colors in table */
  52.    copper_list,                  /* ptr to user copper list */
  53.    0,0,0,0,0,                     /* height, width, depth, bmheight, bmwidth */
  54.    0,0,                           /* top & left viewport offsets */
  55.    0,0,                           /* X & Y bitmap offsets */
  56.    GSVP_ALLOCBM,                  /* flags (alloc bitmap) */
  57.    NULL,NULL,                     /* 2.xx & above compatibility stuff */
  58.    NULL,NULL,                     /* bitmap pointers */
  59.    NULL,                           /* future expansion */
  60.    0,0,0,0                        /* display clip (use nominal) */
  61.    };
  62.  
  63. struct display_struct vector_display =
  64.    {
  65.    NULL,                           /* ptr to previous display view */
  66.    NULL,NULL,                     /* 2.xx & above compatibility stuff */
  67.    0,0,                           /* X and Y display offsets */
  68.    0,                              /* display mode ID */
  69.    4,4,                           /* sprite priorities (sprites in front of playfields) */
  70.    0,                              /* flags */
  71.    &vp,                           /* ptr to 1st viewport */
  72.    NULL                           /* future expansion */
  73.    };
  74.  
  75. /***************************************************************************/
  76.  
  77. main(argc,argv)
  78. int argc;
  79. char *argv[];
  80.  
  81. {
  82.    int err,end=0;
  83.  
  84.    if (gs_open_libs(GRAPHICS,0))   /* open AmigaDOS libs */
  85.       exit(01);               /* if can't open libs, abort */
  86.    parser(argc,argv);         /* parse command line args */
  87.    if (err=setup())            /* if couldn't get set up... abort program */
  88.       {
  89.       printf("\nSetup error: %d\n",err);
  90.       gs_close_libs();         /* close all libraries */
  91.       exit(02);
  92.       }
  93.    Forbid();                  /* take over the entire machine */
  94.    while (!end)               /* this shows off speed */
  95.       {
  96.       draw_vector();
  97.       gs_show_display(&vector_display,1);   /* don't let mouse blanker mess us up */
  98.       end=check_close();      /* end when user hits left mouse button */
  99.       }
  100.    Permit();                  /* OK, let other things run while we clean up */
  101.    cleanup();                  /* close & deallocate everything */
  102.    gs_close_libs();            /* close all libraries */
  103. }
  104.  
  105. /***************************************************************************/
  106.  
  107. void parser(argc,argv)
  108. int argc;
  109. char *argv[];
  110.  
  111. {
  112.    swidth=320;                  /* default width & height */
  113.    sheight=200;
  114.    copheight=200;
  115.    smode=0;                     /* default mode of lores no lace */
  116.    #ifdef NTSC_MONITOR_ID
  117.       if (GfxBase->LibNode.lib_Version >= 36)   /* if WB 2.0 or higher */
  118.          {               /* this defeats mode promotion on AGA machines */
  119.          if (ModeNotAvailable(NTSC_MONITOR_ID))
  120.             {
  121.             smode = PAL_MONITOR_ID;
  122.             sheight=256;
  123.             copheight=256;
  124.             }
  125.          else
  126.             {
  127.             smode = NTSC_MONITOR_ID;
  128.             }
  129.          }
  130.    #endif
  131.    if (argc >= 2)
  132.       {
  133.       if (!(stricmp(argv[1],"DBL")))   /* check for double scan */
  134.          {
  135.          #ifdef DBLNTSC_MONITOR_ID
  136.          if (GfxBase->LibNode.lib_Version >= 39)   /* if WB 3.0 or higher */
  137.             {               /* try for mode promoted AGA display */
  138.             if (!ModeNotAvailable(DBLNTSC_MONITOR_ID))
  139.                {
  140.                smode = DBLNTSC_MONITOR_ID;
  141.                copheight=400;
  142.                }
  143.             else if (!ModeNotAvailable(DBLPAL_MONITOR_ID))
  144.                {
  145.                smode = DBLPAL_MONITOR_ID;
  146.                sheight=256;
  147.                copheight=512;
  148.                }
  149.             }
  150.          #endif
  151.          }
  152.       else if (!(stricmp(argv[1],"DBLHIRES")))   /* check for hires double scan */
  153.          {
  154.          #ifdef DBLNTSC_MONITOR_ID
  155.          if (GfxBase->LibNode.lib_Version >= 39)   /* if WB 3.0 or higher */
  156.             {               /* try for mode promoted AGA display */
  157.             if (!ModeNotAvailable(DBLNTSC_MONITOR_ID))
  158.                {
  159.                swidth=640;
  160.                smode = DBLNTSC_MONITOR_ID;
  161.                copheight=400;
  162.                sheight=400;
  163.                }
  164.             else if (!ModeNotAvailable(DBLPAL_MONITOR_ID))
  165.                {
  166.                swidth=640;
  167.                smode = DBLPAL_MONITOR_ID;
  168.                sheight=256;
  169.                copheight=512;
  170.                }
  171.             smode|=HIRES|LACE;
  172.             }
  173.          #endif
  174.          }
  175.       else if (!(stricmp(argv[1],"HIRES")))   /* check for hires spec */
  176.          {
  177.          swidth=640;
  178.          sheight=400;
  179.          smode|=HIRES|LACE;
  180.          }
  181.       else if (!(stricmp(argv[1],"SUPER")))   /* check for superhires72 */
  182.          {
  183.          #ifdef SUPER72_MONITOR_ID
  184.          if (GfxBase->LibNode.lib_Version >= 36)
  185.             {
  186.             if (!ModeNotAvailable(SUPER72_MONITOR_ID | SUPERLACE_KEY))
  187.                {
  188.                smode=SUPER72_MONITOR_ID | SUPERLACE_KEY;
  189.                swidth=800;
  190.                sheight=600;
  191.                copheight=300;
  192.                }
  193.             }
  194.          #endif
  195.          }
  196.       }
  197. }
  198.  
  199. /***************************************************************************/
  200.  
  201. int setup()
  202.  
  203. {
  204.    vp.height = sheight;               /* set up display dimensions */
  205.    vp.width = swidth;
  206.    vp.depth = 1;
  207.    vp.bmheight = sheight;
  208.    vp.bmwidth = swidth;
  209.    vector_display.modes = smode;
  210.    build_copper();                  /* build custom copper list */
  211.    if (gs_create_display(&vector_display))
  212.       {
  213.       return(-1);
  214.       }
  215.    gs_show_display(&vector_display,1);
  216.    return(0);
  217. }
  218.  
  219. /***************************************************************************/
  220.  
  221. void build_copper()
  222.  
  223. /* build a custom copper list of background color changes */
  224.  
  225. {
  226.    int cnt,cnt2=0,video_gradient;
  227.    short bgcolor,gradient,ctable[15];
  228.  
  229.    bgcolor=BGCOLOR;
  230.    gradient=0;
  231.    video_gradient=(copheight/3)/15;
  232.    for (cnt=0; cnt < 15; cnt++)            /* build copper list */
  233.       {
  234.       if (cnt)
  235.          {
  236.          copper_list[cnt2++]=UC_WAIT;      /* copper wait instruction */
  237.          copper_list[cnt2++]=gradient;      /* y coord to wait on */
  238.          copper_list[cnt2++]=0;            /* x coord to wait on */
  239.          }
  240.       ctable[cnt]=bgcolor;
  241.       copper_list[cnt2++]=UC_SETCOLOR;      /* set color register */
  242.       copper_list[cnt2++]=0;               /* register number */
  243.       copper_list[cnt2++]=ctable[cnt];      /* value for register */
  244.       gradient+=video_gradient;
  245.       bgcolor-=COLOR_GRADIENT;
  246.       if (bgcolor < MIN_COLOR)
  247.          bgcolor=0;
  248.       }
  249.    copper_list[cnt2++]=UC_WAIT;            /* copper wait instruction */
  250.    copper_list[cnt2++]=gradient;            /* y coord to wait on */
  251.    copper_list[cnt2++]=0;                  /* x coord to wait on */
  252.    copper_list[cnt2++]=UC_SETCOLOR;
  253.    copper_list[cnt2++]=0;                  /* color number */
  254.    copper_list[cnt2++]=0;                  /* color value */
  255.    gradient=((copheight/3)*2)-video_gradient;   /* build bottom color gradient */
  256.    for (cnt=14; cnt >= 0; cnt--)            /* build copper list */
  257.       {
  258.       copper_list[cnt2++]=UC_WAIT;         /* copper wait instruction */
  259.       copper_list[cnt2++]=gradient;         /* y coord to wait on */
  260.       copper_list[cnt2++]=0;               /* x coord to wait on */
  261.       copper_list[cnt2++]=UC_SETCOLOR;      /* set color register */
  262.       copper_list[cnt2++]=0;               /* register number */
  263.       copper_list[cnt2++]=ctable[cnt];      /* value for register */
  264.       gradient+=video_gradient;
  265.       }
  266.    copper_list[cnt2++]=UC_END;            /* end coppper list */
  267. }
  268.  
  269. /***************************************************************************/
  270.  
  271. void draw_vector()
  272.  
  273. /* draw a line on the screen */
  274.  
  275. {
  276.    static int line_count=0;
  277.    int x1,y1,cnt;
  278.  
  279.    for (cnt=0; cnt < 100; cnt++)
  280.       {
  281.       x1=gs_random(swidth);
  282.       y1=gs_random(sheight);
  283.       gs_init_vector(0,x1,y1,gs_random(swidth),gs_random(sheight));
  284.       while (x1|y1)
  285.          {
  286.          gs_plot(vp.bitmap1,x1,y1,1);
  287.          gs_step_vector(0,1,&x1,&y1);      /* next point on line */
  288.          }
  289.       }
  290.    line_count+=100;
  291.    if (line_count >= THRESHOLD)
  292.       {
  293.       clear_bitmap(vp.bitmap1);
  294.       line_count=0;
  295.       }
  296. }
  297.  
  298. /***************************************************************************/
  299.  
  300. void clear_bitmap(bitmap)
  301. struct BitMap *bitmap;
  302.  
  303. {
  304.    int cnt;
  305.  
  306.    for (cnt=0; cnt < bitmap->Depth; cnt++)
  307.       {         /* clear each plane */
  308.       gs_blit_fill((unsigned short *)bitmap->Planes[cnt],
  309.          bitmap->Rows*(bitmap->BytesPerRow/2),0);
  310.       }
  311. }
  312.  
  313. /***************************************************************************/
  314.  
  315. int check_close()
  316.  
  317. /* check for user input */
  318.  
  319. {
  320.    if (gs_joystick(0) & (JOY_BUTTON1|JOY_BUTTON2))
  321.       return(1);
  322.    return(0);
  323. }
  324.  
  325. /***************************************************************************/
  326.  
  327. void cleanup()
  328.  
  329. /* release all resources and memory */
  330.  
  331. {
  332.    gs_remove_display(&vector_display);
  333. }
  334.